package cn.kgc.spring07.proxy;

import cn.kgc.spring07.mapper.UserMapper;
import cn.kgc.spring07.mapper.impl.UserMapperImpl;

import javax.lang.model.element.VariableElement;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author: mosin
 * @version: v1.0  2022/12/5
 * jdk的动态代理的实现   基于接口的实现
 */
public class JDKDynamicProxy {

    public static void main(String[] args) {

        final UserMapperImpl userMapperImpl = new UserMapperImpl();

        //通过JDK的动态代理方式 获取 UserMapperImpl的代理对象
        /*
        * 参数1：  ClassLoader loader  类加载器
        *       类加载器的作用： 代理类是不会被分配类加载器
        *       借用其它类的加载器 实现类的加载和对象的创建
        * 参数2:   Class<?>[] interfaces
        *         被代理类实现的接口    Class
        * 参数3:   InvocationHandler
        *         要实现功能增强的对象
        * */

        Class clazz = UserMapperImpl.class;
        Class[] interfaces = clazz.getInterfaces();

        // 通过匿名内部类 创建了InvocationHandler类型的实例对象
        InvocationHandler  invocationHandler = new InvocationHandler() {
            //编写功能增强方法
            /*
            *Object proxy  生成的代理对象
            *Method method  方法对象    通过代理对象调用方法时那么会将代理对象调用的方式 封装成对象传入当前方法
            *Object[] args  代理对象调用方法的参数 也会以数组的形式传入当前方法
            *
            * return Object   执行method方法的返回值
            * */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                String name = method.getName();
                System.out.println("method name = "+name);

                System.out.println("args = " + args[0]);

                System.out.println("----------log日志-----------");
                Object invoke = method.invoke(userMapperImpl, args);

                return invoke;
            }
        };
        // o 通过动态代理方式获取的动态代理对象
        UserMapper  o = (UserMapper) Proxy.newProxyInstance(JDKDynamicProxy.class.getClassLoader(), interfaces, invocationHandler);
        Integer delete = o.delete(1);
        System.out.println("delete = " + delete);

    }
}
